独立开发周记 #22:和Claude 2结对编程
2023,0710-0716
这周突然有那么一瞬间,想把这个周记改成付费阅读,在小报童、竹白之类的平台发布,或者就在这个公众号里开通付费阅读的功能。但是一想到很多大牛大神大佬一直在持续输出免费的高质量的文章,比如肘子哥,我这些流水账还收费的话就太离谱了,这个念头很快就打消了。
极简日记 App Store
这周一直和Claude 2结对编程,实现了上周确定的草稿功能。本以为一两天就能写好,没想到这个功能居然写写改改耗费了整整一周,周六的时候还是决定推翻重写了。
这周所有的的代码工作都是关于 Core Data 的,多了很多关于 Core Data 的新发现。
objectID
在肘子哥的blog里我才知道Core Data的每个托管对象都有objectID这个属性,通过这个属性和existingObject(with:)这个方法就可以很方便地获取某个托管对象。在这之前如果我要获取某个托管对象,我都是通过在model上自定义的id属性构建predicate,然后查询,最后只获取结果中的第一个。
不过,这个属性貌似不能用到predicate里面,我试了几种写法都是报错,Claude 2给出的答案也都是报错。
关联属性
一开始我的想法是:在编辑某条日记的时,先将这个日记的Entry转为Draft,然后把所有可编辑的变量都通过Combine把变化绑定到Draft上,这样这个Draft就可以做到实时保存了。但是这样做发现了一个问题,根据Entry生成对应的Draft后,Entry本来的关联属性就消失了。下面是Claude 2给出的原因。
通过不同的context进行CRUD
通过view的@FetchRequest获取到的Entry托管对象,在编辑完后想通过performBackgroundTask(_:)进行保存,如果编辑Entry本身的属性就没什么问题,如果是改动了关联属性就会遇到闪退。咨询了Claude 2之后,统一了context就解决了这个问题。
Optional 属性
Core Data默认所有的属性都是 Optional,意思是某个属性为空的情况下也可以存入Core Data。但是我之前并不知道这一点,因为 Core Data 自动生成的NSManagedObject代码里所有的属性也都是 Optional 的, 我还以为这个 Optional 和 Swift中的 Optional 是一回事。
为了省去对 Optional 变量的判断,我就把Draft实体的几个属性改成了非Optional,还给设置了默认值,但是,Core Data 自动生成的代码里的属性仍然是 Optional 的……问了Claude 2,给出的答案也是胡说八道。所以最后还是没能去掉每个属性的问号。
另外,对每一个Optional的变量都要心存敬畏,这是我这周踩坑后的心得。日记列表中的数据是由实体Entry转换而来的EntryViewModel。因为Entry的id属性是Optional的,在转换过程中,我就给EntryViewModel对应的id属性赋给了一个默认值,本以为这只是为了消除警告的一个操作,没想到产生了一个隐患,导致我花了半天才找到原因。因为这个默认的UUID,导致有一个没有id的Entry对应的EntryViewModel每次生成时的id都是不同的,接着导致这个EntryViewModel生成的Draft在更新时无法找到原Entry……
尽管经历了各种问题,草稿功能总算是做完了。周日下午发了TestFlight build 11,测试群的群友们立刻发现了各种bug,于是周日晚上又连着发了3个build修复这些bug。无论如何,下周也要发布1.7.6了,然后我就要专心适配iOS 17和开发新app了。
奇怪的阅读量
一直以来,每周这个系列的文章也就几百的阅读量,但是前两篇文章出现了意外增长。
上上周的#20的阅读量首次突破了1000,上周的#21的阅读量居然突破了2000!
我的发现是:
#20的阅读量大部分都在发布的前两天,而#21的大部分阅读量在发布后的四五天
尽管阅读量大幅提高,但是只有一条评论,和3个转发(其中有两个转发还是我自己的,不知道有没有统计进去)
我现在写周记,从不搞标题党和引人眼球的封面图,所以增长的原因应该不是出于这两点
至于内容,#20和#21都是字数相对比较少的两篇文章,本来就没有什么干货,反而显得水分更多了
所以,这是为什么呢?